<?php

require_once __DIR__ . '/../../config/DbConfig.php';

/**
 * Classe genérica para Data Access Objects
 *
 * @author hyzandey
 */
abstract class AbstractDAO {
    /**
     * Lançar ou não erro exibindo a consulta SQL. Somente para desenvolvimento.
     */

    const DEBUG = false;

    private $connection = null;
    private $config;
    protected $filter;
    protected $query = null;
    protected $resultSet = null;

    public function __construct($filter = null) {
        $this->config = new DbConfig();
        $this->filter = $filter;
    }

    /* Imprime na tela a consulta à base e lança um erro para parar o 
     * processamento.
     */

    protected function erroDebug() {
        echo '<pre>' . $this->query . '</pre>';
        throw new Exception('Erro forçado pra fazer debug!');
    }

    private function connect() {

        if (!$this->connection) {
            $connString = $this->config->getConnString();
            $this->connection = pg_pconnect($connString);
            if (!$this->connection) {
                throw new ErrorException("Não foi possível conectar à base.\n");
            }
        }
    }

    /**
     * Executa a consulta que consta no atributo query.
     * 
     * @throws ErrorException
     */
    protected function executaQuery() {

        if (self::DEBUG) {
            $this->erroDebug();
        }

        $this->connect();

        $this->resultSet = pg_query($this->connection, $this->query) or die("
            Erro ao realizar consulta:\n
					$this->query\n"
                        . pg_last_error($this->connection));
    }

    protected function proximaLinhaResultado() {
        return pg_fetch_assoc($this->resultSet);
    }

    protected function ajustaStringFiltro($string) {
        return mb_strtolower(trim($string), 'UTF-8');
    }

    protected function insertWhere($valorWhere, $whereClause) {
        if ($valorWhere) {
            $this->query = $this->query . ' ' . $whereClause .' ';
        }
    }

    public abstract function find();
}

?>
